﻿using System;
using System.Collections.Generic;
using System.Windows.Forms;
using LayerEntity.Sistema;
using LayerLogic;
using LayerLogic.Common;

namespace System2012.Sistema.Documentos
{
    public partial class MantenimientoDocumentos : DevExpress.XtraEditors.XtraForm
    {
        public MantenimientoDocumentos()
        {
            this.InitializeComponent();
            SystemUtils.RecordManagerCommonList.UpdateList += new CommonObjects.AddObject(AddObject);
        }

        #region Variables
        /// <summary>
        /// Indica si estamos editanado o creando uno Nuevo
        /// 0: Nuevo Documento
        /// 1: Editando y Guardando
        /// </summary>
        int operacion = 0;
        #endregion

        #region Metodos de Eventos
        private void AddObject(string msj, EnumOperaciones op, EnumEstadoOperaciones est)
        {
            //this.barEditItem1.Caption = msj;
            if (op == EnumOperaciones.AddCollection)
            {
                if (est == EnumEstadoOperaciones.Complete)
                {
                    this.gridControl1.DataSource = System2012.SystemUtils.RecordManagerCommonList.GetDocument();
                    this.gridControl1.RefreshDataSource();
                }
            }
        }

        #endregion

        #region Metodos
        private void NuevoDocumento()
        {
            this.TxtCodigo.EditValue = "0";
            this.TxtDescripcion.EditValue = string.Empty;
            this.TxtAbreviatura.EditValue = string.Empty;
            this.TxtCodSunat.EditValue = string.Empty;
            this.CbTipo.SelectedIndex = 0;
            this.CbSigno.SelectedIndex = 0;
            this.ChkAfectoIgv.Checked = false;
            this.ChkValoriza.Checked = false;
            this.TxtNumeroItem.EditValue = 0;
            this.operacion = 0;
            this.GCTiposDocumentos.DataSource = System2012.SystemUtils.RecordManagerCommonList.GetTipoDocumento();
            this.GCTiposDocumentos.RefreshDataSource();
        }

        private void DisplayCustomText(object sender, DevExpress.XtraGrid.Views.Base.CustomColumnDisplayTextEventArgs e)
        {

            if (e.Column.Name == "gcEstado")
            {
                object obj = gridView1.GetRowCellValue(e.RowHandle, gcIdEstado);
                if (obj != null)
                {
                    EEstado est = System2012.SystemUtils.RecordManagerCommonList.GetEstadoById(int.Parse(obj.ToString()));
                    if (est != null)
                    {
                        e.DisplayText = est.Descripcion;
                    }
                }
            }
        }
        #endregion

        private void MantenimientoDocumentos_Load(object sender, EventArgs e)
        {
            this.NuevoDocumento();
            this.BGWLoadInformacion.RunWorkerAsync();
        }

        #region BackGround Process
        /// <summary>
        /// Especifica la Operacion Actual Ejecutando
        /// 
        /// 0: Load Informacion de estados.
        /// 1: Load Los tipos de Documentos Existentes.
        /// 2: Load Informacion de Documentos.
        /// 3: Save Documento
        /// </summary>
        int estadoOperacion = 0;
        private void BgwLoadInformacionDoWork(object sender, System.ComponentModel.DoWorkEventArgs e)
        {
            if (this.estadoOperacion == 0)
            {
                this.BGWLoadInformacion.ReportProgress(20, "Load Estados");
                e.Result = SystemUtils.RecordManagerCommonList.GetEstados();
            }
            if (this.estadoOperacion == 1)
            {
                this.BGWLoadInformacion.ReportProgress(30, "Load Tipos de Documentos");
                e.Result = SystemUtils.RecordManagerCommonList.GetTipoDocumento();
            }

            if (this.estadoOperacion == 2)
            {
                this.BGWLoadInformacion.ReportProgress(30, "Load Documentos");
                e.Result = SystemUtils.RecordManagerCommonList.GetDocument();
            }
            if (this.estadoOperacion == 3)
            {
                this.BGWLoadInformacion.ReportProgress(30, "Saving Documento");
                EDocumento doc = (EDocumento)e.Argument;
                if (doc != null)
                {
                    int resultado = System2012.SystemUtils.CommonMaintenanceList.MantenimientoDocumento(doc, this.operacion == 0 ? EnumOperaciones.Insertar : EnumOperaciones.Actualizar);
                    if (resultado > 0)
                    {
                        doc.IdDocumento = resultado;
                        System2012.SystemUtils.RecordManagerCommonList.AddDocumento(doc);
                    }
                }
            }
            this.BGWLoadInformacion.ReportProgress(100, "Completado");
        }

        private void ProcesoCompleto(object sender, System.ComponentModel.RunWorkerCompletedEventArgs e)
        {
            if (this.estadoOperacion == 2)
            {
                this.gridControl1.DataSource = e.Result;
            }
            if (this.estadoOperacion == 1)
            {
                this.GCTiposDocumentos.DataSource = e.Result;
                this.estadoOperacion = 2;
                this.BGWLoadInformacion.RunWorkerAsync();
            }
            if (this.estadoOperacion == 0)
            {
                this.CbEstados.Properties.DataSource = e.Result;
                this.estadoOperacion = 1;
                this.BGWLoadInformacion.RunWorkerAsync();
            }
        }

        private void AvanceProceso(object sender, System.ComponentModel.ProgressChangedEventArgs e)
        {
            this.barEditItem1.Caption = e.UserState.ToString();
            this.barEditItem1.EditValue = e.ProgressPercentage;
        }

        #endregion

        private void MantenimientoDocumentos_FormClosing(object sender, System.Windows.Forms.FormClosingEventArgs e)
        {
            SystemUtils.RecordManagerCommonList.UpdateList -= new CommonObjects.AddObject(AddObject);
        }

        private void ClickItem(object sender, DevExpress.XtraBars.ItemClickEventArgs e)
        {
            if ((string)e.Item.Tag == "Nuevo")
            {
                this.NuevoDocumento();
            }
            if ((string)e.Item.Tag == "Exportar")
            {
                if (this.saveFileDialog1.ShowDialog() == DialogResult.OK)
                {
                    this.gridControl1.ExportToXlsx(this.saveFileDialog1.FileName);
                }
                else {
                    SystemUtils.AlerMessaje("No hay Registros a Exportar");
                }
            }
            if ((string)e.Item.Tag == "Guardar")
            {
                EDocumento doc = new EDocumento();
                doc.IdDocumento = this.operacion == 0 ? 0 : int.Parse(this.TxtCodigo.EditValue.ToString());
                doc.Abreviatura = this.TxtAbreviatura.EditValue.ToString();
                doc.AfectoIgv = this.ChkAfectoIgv.Checked;
                doc.CodigoSunat = TxtCodSunat.EditValue.ToString();
                doc.CodigoSistema = doc.GetCodigoSistema((List <ETipoDocumento>)this.GCTiposDocumentos.DataSource);
                doc.Descripcion = this.TxtDescripcion.EditValue.ToString();
                doc.IngresoSalida = this.CbTipo.SelectedIndex;
                doc.NumeroItems = int.Parse(this.TxtNumeroItem.EditValue.ToString());
                doc.SigoDocumento = this.CbSigno.SelectedIndex;
                doc.Valoriza = this.ChkValoriza.Checked;
                doc.IdEstado = (int)this.CbEstados.EditValue;
                this.estadoOperacion = 3;
                this.BGWLoadInformacion.RunWorkerAsync(doc);
            }
        }

        private void CambiandoIndex(object sender, DevExpress.XtraGrid.Views.Base.FocusedRowChangedEventArgs e)
        {
            EDocumento doc = (EDocumento)this.gridView1.GetFocusedRow();
            if (doc != null)
            {
                this.operacion = 1;
                this.TxtCodigo.EditValue = doc.IdDocumento;
                this.TxtDescripcion.EditValue = doc.Descripcion;
                this.TxtNumeroItem.EditValue = doc.NumeroItems;
                this.TxtCodSunat.EditValue = doc.CodigoSunat;
                this.TxtAbreviatura.EditValue = doc.Abreviatura;
                this.ChkAfectoIgv.Checked = doc.AfectoIgv;
                this.GCTiposDocumentos.DataSource = doc.GetTiposDocumentos(doc.CodigoSistema, System2012.SystemUtils.RecordManagerCommonList.GetTipoDocumento());
                this.CbEstados.EditValue = doc.IdEstado;
                this.CbTipo.SelectedIndex = doc.IngresoSalida;
                this.CbSigno.SelectedIndex = doc.SigoDocumento;
                this.ChkValoriza.Checked = doc.Valoriza;
                this.GCTiposDocumentos.RefreshDataSource();
            }
            else
            {
                this.NuevoDocumento();
            }
        }

        private void TxtBuscar_EditValueChanged(object sender, EventArgs e)
        {
            gridControl1.DataSource = System2012.SystemUtils.RecordManagerCommonList.GetDocument(TxtBuscar.EditValue.ToString());
        }
        
       
    }
}